package com.city.eduservice.controller;


import com.city.commonutils.Result;
import com.city.eduservice.entity.EduCourse;
import com.city.eduservice.entity.vo.CourseInfoVo;
import com.city.eduservice.entity.vo.CoursePublishVo;
import com.city.eduservice.service.EduCourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 课程 前端控制器
 * </p>
 *
 * @author city
 * @since 2020-07-01
 */
@RestController
@RequestMapping("/eduservice/course")
@CrossOrigin
public class EduCourseController {

    @Autowired
    private EduCourseService eduCourseService;

    /**
     * 课程查询
     */
    @GetMapping
    public Result getCourseList(){
        List<EduCourse> list = eduCourseService.list(null);
        return Result.ok().data("list",list);
    }


    /**
     * @param courseInfoVo
     * @return
     * 添加课程
     */
    @PostMapping("addCourseInfo")
    public Result addCourseInfo(@RequestBody CourseInfoVo courseInfoVo){
        String id =eduCourseService.saveCourseInfo(courseInfoVo);
        return Result.ok().data("courseId",id);
    }

    /**
     * @param courseId
     * @return
     * 根据id获取课程，用于数据回显作于修改
     */
    @GetMapping("getCourseInfo/{courseId}")
    public Result getCourseInfo(@PathVariable String courseId){
        //使用mybatis-plus是可以直接在controller中直接crud操作的，但是有逻辑的话需要在service中创建自己的方法实现逻辑
        CourseInfoVo courseInfoVo =eduCourseService.getCourseInfo(courseId);
        return Result.ok().data("courseInfoVo",courseInfoVo);
    }

    @PostMapping("updateCourseInfo")
    public Result updateCourseInfo(@RequestBody CourseInfoVo courseInfoVo){
        eduCourseService.updateCourseInfo(courseInfoVo);
        return Result.ok();
    }

    /**
     * 课程信息确认，多表查询-查询两张表有关系的数据（内连接（两表同时查，同时拼装），
     * 左外连接（先查出左边表，再跟右边表拼接，如果没有左表的数据，则不拼接），右外连接（反之））获取课程的多种信息，提供前端确认信息
     * 内连接，如果数据有得为空，但是需要进行组合封装，则不可使用，应为一张表的数据为空就查不出这些数据
     * 左右链接，有一方数据无论对应的表有没数据，这方数据都要拼装查出
     *
     * 使用左外链接查询确认添加课程信息
     * 课程得所有查出，所以为左表
     * select 具体所需值
     * form 课程表 别名 left (outer外，可省略) join 连接的课程描述表 别名  on （连接的条件） 课程表别名的id=课程描述表别名的id
     *                 （左外连接的另外几张数据表）left join 讲师表 on 课程讲师id=讲师id
     *                 。。。。。。。。
     */

    @GetMapping("getPublishCourseInfo/{id}")
    public Result getPublishCourseInfo(@PathVariable String id){
        CoursePublishVo coursePublishVo = eduCourseService.publishCourseInfo(id);
        return Result.ok().data("publishCourse",coursePublishVo);
    }

    /**
     * 课程最终发布
     * 修改课程信息得发布状态
     */
    @PostMapping("publishCourse/{id}")
    public Result publishCourse(@PathVariable String id){
        EduCourse eduCourse = new EduCourse();
        eduCourse.setId(id);
        eduCourse.setStatus("Normal");
        eduCourseService.updateById(eduCourse);
        return Result.ok();
    }


    /**
     * 删除课程，需要删除阿里云储存的视频，描述，小节，章节再课程
     * 外键，表的外键为另一张表的主键，如果数据库关联物理外键不太好，约束太多
     * 一（提供主键）对多（一个字段储存外键）
     * 多-使用着一的主键，所以先删除外键的字段数据才能删除主键的字段
     */

    //查get，删delete，增，改post
    @DeleteMapping("{courseId}")
    public Result deleteCourse(@PathVariable String courseId){
        eduCourseService.removeCorse(courseId);
        return Result.ok();
    }
}